package com.example.jenkinstest.controller.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 有关日期的公用方法类
 * 
 * <p>
 * 创建日期：2015年7月23日
 * </p>
 * 
 * @version V1.0
 */
@Slf4j
public class DateUtils {
	private static final long MILL_DAY = 1000 * 24 * 60 * 60;// 一天的毫秒数
	private static final long MILL_HOUR = 1000 * 60 * 60; // 一小时的毫秒数
	private static final long MILL_MINUTE = 1000 * 60; // 一分钟的毫秒数
	private static final long MILL_SECONDS = 1000; // 一秒钟的毫秒数

	public static final String TIME_FORMAT_REGEX = "yyyy-MM-dd HH:mm:ss";
	public static final String FORMAT_DATE_STR = "yyyy-MM-dd";



	/**
	 * 将字符串的时间转换为date,带有时分秒
	 */
	public static Date changeStringToDate(String date) {
		SimpleDateFormat sdf = new SimpleDateFormat(TIME_FORMAT_REGEX);
		try {
			return sdf.parse(date);
		} catch (ParseException e) {
		}
		return null;
	}

	/**
	 * 获取当前时间
	 * 
	 * @return
	 */
	public static Date getCurrentDate() {
		return new Date();
	}

	/**
	 * 日期格式化
	 * 
	 * @param pattern
	 * @param date
	 * @return
	 */
	public static String getParseDate(String pattern, Date date) {
		SimpleDateFormat sdf = new SimpleDateFormat();
		sdf.applyPattern(pattern);
		return sdf.format(date);
	}

	/**
	 * 格式化日期为Date型(yyyy-MM-dd)
	 * 
	 * @param date
	 * @return
	 */
	public static Date parse(String date) {
		return parse(date, FORMAT_DATE_STR);
	}

	/**
	 * 根据指定日期格式格式化日期为Date型
	 * 
	 * @param date
	 * @param formater
	 * @return
	 */
	public static Date parse(String date, String formater) {
		SimpleDateFormat sdf = new SimpleDateFormat(formater);
		Date result = null;
		try {
			result = sdf.parse(date);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return result;
	}

	/**
	 * 计算日期减天数
	 * 
	 * @param date
	 * @param days
	 * @return
	 */
	public static String minusDay(Date date, int days) {
		Calendar c = new GregorianCalendar();
		c.setTime(date);
		c.set(Calendar.DATE, c.get(Calendar.DATE) - days);
		return getParseDate(FORMAT_DATE_STR, c.getTime());
	}

	/**
	 * 计算日期加天数
	 * 
	 * @param date
	 * @param days
	 * @return
	 */
	public static String addDay(Date date, int days) {
		SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
		Calendar c = new GregorianCalendar();
		c.setTime(date);
		c.add(Calendar.DAY_OF_MONTH, days);
		return getParseDate(FORMAT_DATE_STR, c.getTime()) + " "
				+ sdf.format(date);
	}

	/**
	 * 描述 ： 获取系统时间，格式yyyyMMddHHmmss
	 * 修改人：
	 * </p>
	 */
	public static String getDateTimeString() {

		SimpleDateFormat fm = new SimpleDateFormat("yyyyMMddHHmmss");
		return fm.format(new Date());
	}

	/**
	 * 描述 ： 获取系统时间，格式yyyy-MM-dd HH:mm:ss
	 * 修改人：
	 * </p>
	 */
	public static String getCurDateTime() {
		SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return fm.format(new Date());
	}

	/**
	 * 描述 ：格式化 yyyy-MM-dd HH:mm:ss
	 * 修改人：
	 */
	public static String convertDate(Object obj) {
		SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		return fm.format(obj);
	}

	/**
	 * 描述 ：格式化 yyyy-MM-dd
	 * 修改人：
	 * </p>
	 */
	public static String convertDateSimple(Object obj) {
		SimpleDateFormat fm = new SimpleDateFormat("yyyy-MM-dd");
		return fm.format(obj);
	}

	/**
	 * 描述 ： 获取系统日期，格式yyyyMMdd
	 * 修改人：
	 */
	public static String getDateString() {
		SimpleDateFormat fm = new SimpleDateFormat("yyyyMMdd");
		return fm.format(new Date());
	}

	/**
	 * 描述 ： 获取当前系统时间，格式：yyyyMMddHHmmssSSS，可作为订单号使用
	 * 修改人：
	 */
	public static String getDateTimeForOrderString() {

		SimpleDateFormat fm = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		return fm.format(new Date());
	}

	/**
	 * 描述 ： 给当前时间加上一些天数
	 * 
	 * @param num
	 * @return <p>
	 */
	public static String getCurrentTimeAddNumDay(int num) {
		SimpleDateFormat fm = new SimpleDateFormat("yyyyMMdd");
		Calendar Cal = Calendar.getInstance();
		Cal.setTime(new Date());
		Cal.add(Calendar.DATE, num);
		return fm.format(Cal.getTime());
	}

	/**
	 * 把字符串的日期转换为指定格式的字符串日期
	 * 
	 * @param date
	 *            需要格式化的日期
	 * @param pattern
	 *            格式
	 * @return
	 */
	public static String formatDate(String date, String pattern) {
		if (StringUtils.isEmpty(date)) {
			return "";
		}
		if (StringUtils.isEmpty(pattern)) {
			pattern = "yyyy-MM-dd";
		}
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		try {
			return df.format(df.parse(date));
		} catch (ParseException e) {
			log.error("日期转换异常：", e);
			return "";
		}
	}


	/**
	 * @method getMonthMinu <br>
	 * @Description 计算两个日期相差自然月 <br>
	 * @author zhuyz <br>
	 * @email 2361883887@qq.com<br>
	 * @date 2015年8月25日 下午3:35:05
	 * @param day1
	 * @param day2
	 * @return
	 */
	public static int getMonthMinu(Date day1, Date day2) {
		Calendar c = Calendar.getInstance();

		c.setTime(day1);
		int year = c.get(Calendar.YEAR);
		int month = c.get(Calendar.MONTH);

		c.setTime(day2);
		int year1 = c.get(Calendar.YEAR);
		int month1 = c.get(Calendar.MONTH);

		int result;
		if (year == year1) {
			result = month1 - month;// 两个日期相差几个月，即月份差
		} else {
			result = 12 * (year1 - year) + month1 - month;// 两个日期相差几个月，即月份差
		}
		return Math.abs(result);
	}


	/**
	 * 比较两个时间大小
	 * @param date1
	 * @param date2
	 * @return date1 > date2 返回 1; <br>
	 *         date1 < date2 返回-1; <br>
	 *         date1 = date2 返回0
	 */
	public static int compareDate(Date date1, Date date2) {
		Calendar cal1 = Calendar.getInstance();
		Calendar cal2 = Calendar.getInstance();
		cal1.setTime(date1);
		cal2.setTime(date2);
		return cal1.compareTo(cal2);
	}


	/**
	 * 日期比较大小
	 * <p>
	 * @param dateA
	 * @param dateB
	 * @return dateA>dateB 1 dateA<dateB -1 dataA==dateB 0
	 */
	public static String compareCurDate(String dateA, String dateB) {
		if (null == dateA || null == dateB || ("".equals(dateA)) || ("".equals(dateB)))
			return "the params is error";
		log.info("****日期比较参数为" + dateA + "***" + dateB);
		try {
			DateFormat fdate = new SimpleDateFormat("yyyy-MM-dd");
			dateA = fdate.format(fdate.parse(dateA));
			dateB = fdate.format(fdate.parse(dateB));
			if (java.sql.Date.valueOf(dateA).after(java.sql.Date.valueOf(dateB))) {
				return "1";
			} else if (dateA.equals(dateB)) {
				return "0";
			} else {
				return "-1";
			}
		} catch (Exception e) {
			log.error("日期比较错误", e);
			return "the result is wrong";
		}
	}
	/*
	 * 时间戳转日期类型
	 */
	public static Date timeStampToDate(Long timeStampValue) {
		try {
			if(timeStampValue != null) {
				Timestamp timestamp = new Timestamp(timeStampValue);
				Date dateValue = timestamp;
				return dateValue;
			}
			return null;
		} catch (Exception e) {
			log.error("supply_error_log:",e);
		}
		return null;
	}
	
	/**
	 * 计算日期减天数
	 * 
	 * @param date
	 * @param days
	 * @return
	 */
	public static String minusDayMethod(Date date, int days) {
		Calendar c = new GregorianCalendar();
		c.setTime(date);
		c.set(Calendar.DATE, c.get(Calendar.DATE) - days);
		return getParseDate(FORMAT_DATE_STR, c.getTime());
	}
	
}
